package com.sword.www.designPattern.singleton;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 饿汉式单例模式
 * @author linmeng
 * @version 1.0
 * @date 2021年11月9日 21:25
 */
public class EagerSingleton {
    private static final EagerSingleton eagerSingleton = new EagerSingleton();

    private EagerSingleton(){}

    /**
     *
     * 直接返回
     * @author linmeng
     * @date 2021年11月9日 21:44
     * @return com.sword.www.designPattern.singleton.EagerSingleton
     */
    public static EagerSingleton getEagerInstance(){

        return eagerSingleton;
    }

    /**
     *
     * 反射破坏单例模式
     * @param args
     * @author linmeng
     * @date 2021年11月9日 21:45
     * @return void
     */
    public static void main(String[] args) throws Exception {
        // 获取构造器
        Constructor<EagerSingleton> constructor = EagerSingleton.class.getDeclaredConstructor();
        // 设置可访问私有构造
        constructor.setAccessible(true);
        // 反射创建对象
        EagerSingleton eagerSingleton = constructor.newInstance();
        // 单例创建对象
        EagerSingleton lazyInstance = EagerSingleton.getEagerInstance();
        // 判断对象是否同一个
        System.out.println(lazyInstance==eagerSingleton);

        // 创建文件输出流
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("LazySingleton.file"));
        // 写入文件
        outputStream.writeObject(LazySingleton.getLazyInstance());
        // 文件中读取单例对象
        File file = new File("LazySingleton.file");
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
        LazySingleton lazySingleton = (LazySingleton) inputStream.readObject();
        System.out.println(lazySingleton==LazySingleton.getLazyInstance());
    }
}
